home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 6 / Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso / 009a / dtest12.zip / DTESTFOX.ASM < prev    next >
Assembly Source File  |  1991-06-11  |  7KB  |  158 lines

  1. PAGE 60,132
  2. TITLE DTESTFOX 1.2 - A DISKETTE TEST MODULE FOR A FOXPRO PROGRAM.
  3. ;
  4. ;  Written by:  Richard L. Fink
  5. ;               RainTree Computer Systems
  6. ;               P.O.Box 2339
  7. ;               Mill Valley, CA 94941
  8. ;
  9. ;  Date:        June 11, 1991
  10. ;  Compiler:    MASM 6.0
  11. ;
  12. ;  License:     DTESTFOX.BIN and it's assembler source file are hereby
  13. ;               placed in the Public Domain.
  14. ;
  15. ;
  16. ;  DTESTFOX.BIN module which is run as a Foxpro function.  It tests a diskette
  17. ;  drive to see whether or not it contains a diskette.  If a diskette is
  18. ;  detected, DTESTFOX will determine which of the following states it is in:
  19. ;  unformatted, formatted with no files, formatted with files.  A single
  20. ;  character is returned for each condition.
  21. ;
  22. ;  This is invaluable for preventing the dreaded:
  23. ;                    ABORT, RETRY, IGNORE?
  24. ;  in the middle of your beautiful Foxpro application screen.
  25. ;
  26. ;  DTESTFOX.BIN is run by calling it as a Foxpro function, using the "With"
  27. ;  option.  The "With" value defines a one character field which contains
  28. ;  the letter of the diskette drive you wish to check.  Note that no
  29. ;  validation is performed on the drive character.  An invalid drive will
  30. ;  return that the drive contains an unformatted diskette.
  31. ;
  32. ;
  33. ;  Summary:
  34. ;  --------
  35. ;
  36. ;  Call Values:
  37. ;      This module expects a 1 character field passed to it.  That field
  38. ;      will contain the drive character in either upper or lower case.  On
  39. ;      entry to this module the field is pointed to by the registers DS:BX.
  40. ;
  41. ;  Return Values:
  42. ;      This module will return a 1 character value to the calling program.
  43. ;      It will place that value in the source field, replacing the drive
  44. ;      character.
  45. ;
  46. ;      The return value will be-
  47. ;           0 - Drive contains a formatted diskette which is EMPTY.
  48. ;           1 - Drive contains a formatted diskette with files or directories.
  49. ;           2 - Drive contains an UNFORMATTED diskette.
  50. ;           3 - Drive does NOT contain a diskette.
  51. ;           4 - Drive is an unknown unit.
  52. ;
  53. ;  -------------------------------------------------------------------------
  54. ;  The idea for DTESTFOX came from a DOS Tip by Dan Gookin in the April 1991
  55. ;  issue of PC Computing Magazine.
  56. ;
  57. PAGE
  58. ;
  59. DTEST_SEG   SEGMENT BYTE PUBLIC
  60.             ASSUME  CS:DTEST_SEG,DS:DTEST_SEG
  61. ;
  62. ;
  63. DTEST       PROC    FAR
  64.             PUSH    AX                 ;ALL REGISTERS MUST BE PRESERVED
  65.             PUSH    CX                 ;  DUE TO THE NON-STANDARD NATURE
  66.             PUSH    DX                 ;  OF INT-25.
  67.             PUSH    SI
  68.             PUSH    DI
  69.             PUSH    BP
  70.             PUSH    ES
  71.             PUSH    DS                 ;SAVE PARM SEG.
  72.             PUSH    BX                 ;SAVE PARM PTR.
  73. ;
  74.             MOV     AL,[BX]            ;GET PARM FROM FOX FIELD.
  75.             PUSH    CS                 ;EQUALIZE DS TO CS.
  76.             POP     DS                 ;EQUALIZE DS TO CS.
  77. ;
  78.             AND     AL,NOT 20H         ;CONVERT TO UPPER CASE.
  79.             JZ      @F                 ;NO PARM, USE DEFAULT.
  80.             MOV     DRIVENO,AL         ;SAVE IT.
  81. @@:
  82. ;                            ;ABSOLUTE DISK READ.
  83.             MOV     DX,0               ;LOGICAL SECTOR NO.
  84.             MOV     CX,1               ;NUMBER OF SECTORS TO READ.
  85.             MOV     BX,OFFSET DTA      ;PTR TO DTA.
  86.             MOV     AL,DRIVENO         ;GET DRIVE CAHARACTER.
  87.             SUB     AL,41H             ;CONVERT ASCII DRIVE CHAR TO A DRIVE NUMBER.
  88.             INT     25H                ;ABSOLUTE DISK READ.
  89.             POP     DX                 ;DISCARD FLAGS LEFT ON THE STACK BY INT-25.
  90.             JC      BAD_READ           ;DRIVE DOES NOT CONTAIN A FORMATTED DISKETTE.
  91. ;
  92. ;                            ;DISKETTE IS FORMATTED-  CHECK FOR FILES.
  93.             PUSH    DS                 ;SAVE DATA SEG.
  94.             MOV     AH,2FH             ;GET DTA, ES:BX RETURNED.
  95.             INT     21H                ;DOS FUNCTION CALL.
  96.             PUSH    BX                 ;SAVE OFFSET TO FOX DTA.
  97.             PUSH    ES                 ;SAVE BASE   TO FOX DTA.
  98. ;
  99.             MOV     DX,OFFSET DTA      ;PT TO LOCAL DTA.
  100.             MOV     AH,1AH             ;SET DTA, TO DS:DX.
  101.             INT     21H                ;DOS FUNCTION CALL.
  102. ;
  103.             MOV     DX,OFFSET DRIVENO  ;PT TO DRIVE,PATH,FILENAME STRING.
  104.             MOV     CX,017H            ;ATTRIBUTE.
  105.             MOV     AH,4EH             ;FIND 1ST FILENAME MATCH, @DS:DX.
  106.             INT     21H                ;DOS FUNCTION CALL.
  107. ;
  108. PAGE
  109. ;
  110.             POP     DS                 ;GET BASE   TO FOX DTA.
  111.             POP     DX                 ;GET OFFSET TO FOX DTA.
  112.             PUSHF                      ;SAVE SYSTEM STATUS FROM FILE FIND.
  113.             MOV     AH,1AH             ;SET DTA, TO DS:DX.
  114.             INT     21H                ;DOS FUNCTION CALL.
  115.             POPF                       ;RESTORE SYSTEM STATUS FROM FILE FIND.
  116.             POP     DS                 ;RESTORE DATA SEG.
  117. ;
  118.             MOV     DL,'0'             ;SETUP BASE RETURN CODE.
  119.             JC      RTNCD_0            ;DISKETTE HAS NO FILES.
  120.             JMP     RTNCD_1            ;DISKETTE HAS FILES.
  121. ;
  122. ;
  123. BAD_READ:                    ;DRIVE CONTAINS NO DISKETTE, OR UNFORMATTED DISKETTE.
  124.             MOV     DL,'0'             ;SETUP BASE RETURN CODE.
  125.             CMP     AH,1FH             ;READ ERROR-  DRIVE FAILED TO RESPOND ?
  126.             JAE     RTNCD_3            ;YES.
  127.             CMP     AH,8               ;READ ERROR-  BAD CRC ?
  128.             JE      RTNCD_2            ;YES.
  129.             CMP     AX,0201H           ;READ ERROR-  UNKNOWN UNIT ?
  130.             JE      RTNCD_4            ;YES.
  131.             JMP     RTNCD_2            ;OTHER READ ERROR.
  132. ;
  133. ;
  134. RTNCD_4:    INC     DL                 ;RTN CODE 4 - Drive is an unknown unit.
  135. RTNCD_3:    INC     DL                 ;RTN CODE 3 - Drive does NOT contain a diskette.
  136. RTNCD_2:    INC     DL                 ;RTN CODE 2 - Drive contains an UNFORMATTED diskette.
  137. RTNCD_1:    INC     DL                 ;RTN CODE 1 - Drive contains a formatted diskette with files.
  138. RTNCD_0:                               ;RTN CODE 0 - Drive contains a formatted diskette with no files.
  139. ;
  140.             POP     BX                 ;RESTORE PARM PTR.
  141.             POP     DS                 ;RESTORE PARM SEG.
  142.             MOV     [BX],DL            ;SETUP RETURN CODE IN FOX FIELD.
  143.             POP     ES
  144.             POP     BP
  145.             POP     DI
  146.             POP     SI
  147.             POP     DX
  148.             POP     CX
  149.             POP     AX
  150.             RET                        ;FAR RETURN.
  151. DTEST       ENDP
  152. ;
  153. DRIVENO     DB      41H,':\*.*',0      ;DRIVE, PATH, FILENAME, ASCIIZ STRING.
  154. DTA         DB      512 DUP(?)         ;DTA-  SIZE = 1 SECTOR.
  155. ;
  156. DTEST_SEG   ENDS
  157.             END     DTEST
  158.